package com.sheng.leetcode.year2022.month11.day25;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/11/25
 *<p>
 * 809. 情感丰富的文字<p>
 *<p>
 * 有时候人们会用重复写一些字母来表示额外的感受，比如 "hello" -> "heeellooo", "hi" -> "hiii"。<p>
 * 我们将相邻字母都相同的一串字符定义为相同字母组，例如："h", "eee", "ll", "ooo"。<p>
 * 对于一个给定的字符串 S ，如果另一个单词能够通过将一些字母组扩张从而使其和 S 相同，<p>
 * 我们将这个单词定义为可扩张的（stretchy）。扩张操作定义如下：选择一个字母组（包含字母 c ），<p>
 * 然后往其中添加相同的字母 c 使其长度达到 3 或以上。<p>
 * 例如，以 "hello" 为例，我们可以对字母组 "o" 扩张得到 "hellooo"，<p>
 * 但是无法以同样的方法得到 "helloo" 因为字母组 "oo" 长度小于 3。此外，<p>
 * 我们可以进行另一种扩张 "ll" -> "lllll" 以获得 "helllllooo"。如果 S = "helllllooo"，<p>
 * 那么查询词 "hello" 是可扩张的，<p>
 * 因为可以对它执行这两种扩张操作使得 query = "hello" -> "hellooo" -> "helllllooo" = S。<p>
 * 输入一组查询单词，输出其中可扩张的单词数量。<p>
 *<p>
 * 示例：<p>
 * 输入：<p>
 * S = "heeellooo"<p>
 * words = ["hello", "hi", "helo"]<p>
 * 输出：1<p>
 * 解释：<p>
 * 我们能通过扩张 "hello" 的 "e" 和 "o" 来得到 "heeellooo"。<p>
 * 我们不能通过扩张 "helo" 来得到 "heeellooo" 因为 "ll" 的长度小于 3 。<p>
 *<p>
 * 提示：<p>
 * 0 <= len(S) <= 100。<p>
 * 0 <= len(words) <= 100。<p>
 * 0 <= len(words[i]) <= 100。<p>
 * S 和所有在 words 中的单词都只由小写字母组成。<p>
 */
public class LeetCode0809 {
    @Test
    public void test01() {
//        String s = "heeellooo";
//        String[] words = {"hello", "hi", "helo"};
        String s = "aaa";
        String[] words = {"aaaa"};
        System.out.println(new Solution().expressiveWords(s, words));
    }
}
class Solution {
    public int expressiveWords(String s, String[] words) {
        /**
         * 思路：首先单词 word 中所包含的字符和顺序应该都和字符串 s 保持一致
         */
        int ans = 0;
        // 循环判断单词 word 是否可扩张为字符串 s
        for (String word : words) {
            /**
             * 获取字符串 s 中某一字符连续长度为 r1 - l1
             * 获取字符串 word 中某一字符连续长度为 r2 - l2
             * 在字符相等，且字符串 s 中的字符长度和字符串 word 相等，或者 s 中的长度大于 word 中长度的同时，还要大于等于 3 则满足条件
             */
            int l1 = 0, r1 = 0;
            int l2 = 0, r2 = 0;
            boolean flag = true;
            while (r1 < s.length() && r2 < word.length()) {
                if (s.charAt(l1) != word.charAt(l2)) {
                    flag = false;
                    break;
                }
                // 循环获取相同字符的最后一个位置的坐标
                while (r1 < s.length() && s.charAt(l1) == s.charAt(r1)) {
                    r1++;
                }
                while (r2 < word.length() && word.charAt(l2) == word.charAt(r2)) {
                    r2++;
                }
                if ((r1 - l1 > r2 - l2 && r1 - l1 >= 3) || r1 - l1 == r2 - l2) {
                    // 满足条件事，将 l1 和 l2 赋值新字符的坐标
                    l1 = r1;
                    l2 = r2;
                } else {
                    flag = false;
                    break;
                }
            }
            // 判断是否可扩张
            if (r1 == s.length() && r2 == word.length() && flag) {
                ans++;
            }
        }
        // 可优化，将字符串 s 的计算拿到外面去，存放起来
        return ans;
    }
}
